package com.csun.cmny.provider.service;

import com.csun.cmny.base.dto.LoginAuthDto;
import com.csun.cmny.core.support.IService;
import com.csun.cmny.provider.dto.ConfirmCycleBillDto;
import com.csun.cmny.provider.dto.OmcOldManBillDto;
import com.csun.cmny.provider.model.domain.*;
import com.csun.cmny.provider.model.dto.cycle.CycleBillDto;
import com.csun.cmny.provider.model.dto.cycle.OldmanFixedQueryDto;
import com.csun.cmny.provider.model.vo.cycle.OldmanBillVo;
import com.csun.cmny.provider.vo.OldmanBillInforVo;
import com.csun.cmny.provider.vo.OmcOldManBillDetailVo;
import com.csun.cmny.provider.vo.OmcOldManBillVo;
import com.csun.cmny.provider.vo.TurnoverVo;

import java.util.List;

/**
 * @author chenzheng
 * @description:
 * @date 2019/8/15 17:48
 */
public interface OmcOldManBillService extends IService<OmcOldManBill> {

    /**
     *
     * @param cycleBillDto
     * @param loginAuthDto
     */
    void createCycleBill(CycleBillDto cycleBillDto, LoginAuthDto loginAuthDto);

    /**
     * 根据老人姓名查询账单列表
     *
     * @param omcOldManBillDto
     * @return
     */
    List<OmcOldManBillVo> selectBillByName(OmcOldManBillDto omcOldManBillDto);

    /**
     * 根据账单ID查询账单详情
     *
     * @param omcOldManBillDto
     * @return
     */
    OmcOldManBillDetailVo queryBillDetail(OmcOldManBillDto omcOldManBillDto);


    /**
     * 根据老人ID和账单类型查询账单详情
     *
     * @param omcOldManBillDto
     * @return
     */
    List<OmcOldManBillDetailVo> queryBillDetailList(OmcOldManBillDto omcOldManBillDto);

    /**
     * 保存入院账单
     *
     * @param oldManBill        账单基础信息
     * @param billItemList      缴费项目信息
     * @param omcBillMeal       选择的套餐信息
     * @param billInHospitalFee 入院账单费用统计
     * @param loginAuthDto      登录人信息
     * @return
     */
    Integer saveInHospitalBill(OmcOldManBill oldManBill, List<OmcBillItem> billItemList, OmcBillMeal omcBillMeal, OmcBillInHospitalFee billInHospitalFee, LoginAuthDto loginAuthDto);

    /**
     * 保存出院账单
     *
     * @param oldManBill         账单基础信息
     * @param billItemList       缴费项目信息
     * @param billBackItemList   退费项目信息
     * @param billOutHospitalFee 出院账单费用统计
     * @param loginAuthDto       登录人信息
     * @return
     */
    boolean saveOutHospitalBill(OmcOldManBill oldManBill, List<OmcBillItem> billItemList, List<OmcBillBackItem> billBackItemList, OmcBillOutHospitalFee billOutHospitalFee, LoginAuthDto loginAuthDto);

    /**
     * 保存调整账单
     *
     * @param oldManBill    账单基础信
     * @param billItemList  缴费项目
     * @param billAdjustFee 调整账单费用统计
     * @param loginAuthDto  登录人信息
     * @return
     */
    boolean saveAdjustBill(OmcOldManBill oldManBill, List<OmcBillItem> billItemList, OmcBillAdjustFee billAdjustFee, LoginAuthDto loginAuthDto);

    /**
     * 保存周期账单
     *
     * @param oldManBill    账单基础信息
     * @param billItemList  缴费项目
     * @param billPeriodFee 周期账单费用统计
     * @param loginAuthDto  登录人信息
     * @return 周期账单ID
     */
    Long savePeriodBill(OmcOldManBill oldManBill, List<OmcBillItem> billItemList, OmcBillPeriodFee billPeriodFee, LoginAuthDto loginAuthDto);

    /**
     * 计算周期费用,并添加周期账单
     *
     * @param groupId
     * @return
     */
    void addPeriodBill(Long groupId);


    /**
     * 账单缴费
     * @param omcOldManBillDto
     * @param loginAuthDto
     * @return
     */
    boolean payFee(OmcOldManBillDto omcOldManBillDto,LoginAuthDto loginAuthDto);

    /**
     * query oldman check in bill id
     *
     * @param oldmanId  the oldman id
     *
     * @return  the oldman check in bill id the last time
     */
    Long queryOldmanCheckInBillId(Integer oldmanId);

    /**
     * 根据Id查询账单详情
     *
     * @param id    账单Id
     *
     * @return  账单详情
     */
    Object queryBillById(Long id);

    /**
     * 院长审批缴费单
     * @param: [billId, loginAuthDto]
     * @return: java.lang.Integer
     */
    Integer approveByAdmin(Long billId, Integer isPassed, LoginAuthDto loginAuthDto);

    /**
     * 查询未审批的缴费单
     * @param: [omcOldManBillDto]
     * @return: java.util.List<com.csun.cmny.provider.vo.OmcOldManBillVo>
     */
    List<OmcOldManBillVo> queryNeedApproveListWithPage(OmcOldManBillDto omcOldManBillDto);

    /**
     * 根据账单Id查询该账单手动输入价格收费项列表
     *
     * @param billId    the bill id
     *
     * @return  the list.
     */
    List<OmcBillItem> queryFixedListByBillId(Long billId);

    /**
     * 确认周期账单
     *
     * @param confirmCycleBillDto
     *
     * @return
     */
    Integer confirmCycleBill(ConfirmCycleBillDto confirmCycleBillDto);

    /**
     * query fixed list by olmdan id list and date
     *
     * @param oldmanFixedQueryDto
     *
     * @return
     */
    List<OldmanBillVo> queryFixedListByOldmanIdListAndDate(OldmanFixedQueryDto oldmanFixedQueryDto);

    /**
     * 生成账单
     *
     * @param cycleBillDto
     * @return
     */
    Integer createCycleBillWithGroupId(CycleBillDto cycleBillDto);

    /*
    * 武昌数据迁移生成账单
    *
    * */
    Integer moveInHospitalBill(OmcOldManBill oldManBill, List<OmcBillItem> billItemList, OmcBillMeal omcBillMeal, OmcBillInHospitalFee billInHospitalFee, LoginAuthDto loginAuthDto);
    /*
     * 集团化缴费记录单查询
     * */
    List<OldmanBillInforVo> selectAllBill(OldmanBillInforVo oldmanbill);
    /*
     * 营业额报表查询
     * */
    List<TurnoverVo> selectTurnover(TurnoverVo turnoverVo);
}
